﻿using System;
using System.Collections.Generic;
using System.Data.Entity;
using System.Data.Objects;
using System.Linq;
using System.Runtime.Remoting.Messaging;
using System.Text;
using System.Threading.Tasks;
using OilWaterSystem.Model;

namespace OilWaterSystem.DAL
{
    public class EFContextFactory
    {
        /// <summary>
        /// 帮我们返回当前线程内的数据库上下文，如果当前线程内没有上下文，那么创建一个上下文，并保证
        /// 上线问实例在线程内部是唯一的
        /// CallContext是类似于方法调用的线程本地存储区的专用集合对象，并提供对每个逻辑执行线程都唯一的数据槽(数据存储区域)，数据槽不在其他逻辑线程上的调用上下文之间共享，当CallContext沿执行代码路径往返传播并且由该路径的各个对象检查时，可以将其对象添加其中。
        /// 在CallContext中有两个比较重要的静态方法
        ///  1)void SetData(string name,object data)，往集合中存入数据。
        ///  2) object GetData(string name)  代表取数据，传递一个Key过去取出对应的值。
        /// </summary>
        /// <returns></returns>
        public static DbContext GetCurrentDbContext()
        {
            //CallContext：是线程内部唯一的独用的数据槽（一块内存空间）
            //传递DbContext进去获取实例的信息，在这里进行强制转换
            var dbContext = CallContext.GetData("DbContext") as DbContext;
            if (dbContext == null)  //线程在数据槽里面没有此上下文
            {
                dbContext = new Oil_Water_SystemDBEntities(); //创建一个EF上下文
                //我们在创建一个，放到数据槽中去
                CallContext.SetData("DbContext", dbContext);
            }
            return dbContext;
        }
    }
}
